package net.onewfour.dao.detail;

import java.util.List;

import net.onewfour.dao.DBSuper;
import net.onewfour.dao.TableList;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;

/***
 * 数据
 * @author Marc
 * @version 1.0
 */
public class DBArticle extends DBSuper {
	
	private static DBArticle DB = null;


	/***
	 * 初始化当前类
	 * @user Marc
	 * @createtime 2015年1月23日 下午5:08:30
	 * @return
	 */
	public static DBArticle instance() {
		if(DB==null){
			DB = new DBArticle();
		}
		return DB;
	}
	
	/**
	 * 
	 * @user Marc
	 * @createtime 2015年1月22日 下午5:36:08
	 * @return 查询所有的文章
	 */
	public List<Record> find (){
		List<Record>  list = super.cache(TableList._Article, TableList._Article);
		if(list == null ){
			list = super.find(TableList._Article);
			super.cache(TableList._Article, TableList._Article, list);
		}
		return list ; 
	}
	
	/***
	 * 
	 * @user Marc
	 * @createtime 2015年1月22日 下午5:37:16
	 * @param id
	 * @return 根据ID返回文章 没有则 null
	 */
	public Record find(Object id ){
		String key = TableList._Article+"@ID"+id ; 
		Record  cord = super.cache(TableList._Article, key);
		if(cord == null){
			cord = Db.findById(getFullTable(TableList._Article), id);
			super.cache(TableList._Article, key, cord);
		}
		return cord ; 
	}

	/***
	 * 
	 * @user Marc
	 * @createtime 2015年1月22日 下午5:42:33
	 * @param id
	 * @return 查询用户所有发布的文章
	 */
	public List<Record> findByUserID(Object id){
		List<Record> list = super.cache(TableList._Article, "uid@@@"+id);
		if(list == null ){
			super.findByColumns(TableList._Article,new Object[]{"uid"},new Object[]{id});
			super.cache(TableList._Article, "uid@@@"+id,list);
		}
		return list ; 
	}


	/***
	 * 
	 * @user Marc
	 * @createtime 2015年1月22日 下午5:43:25
	 * @param id 用户ID
	 * @param date 起始时间
	 * @param date1 结束时间
	 * @return 根据用户ID查询一个时间段发布的文章
	 */
	public List<Record> findByUserID(Object id,String date,String date1){
		
		String key = "id@@@"+id+"releasetime@@@"+date+"releasetime@@@"+date;
		List<Record> list = super.cache(TableList._Article,key );
		if(list == null ){
			StringBuilder sb = new StringBuilder();
			sb.append(" select * from ");
			sb.append(getFullTable(TableList._Article));
			sb.append("  where id =? ");
			sb.append(" and releasetime >= ?");
			sb.append(" and releasetime <= ?");
			list = Db.find(sb.toString(), id,date,date1);
			super.cache(TableList._Article, key,list);
		}
		return list;
	}
	
	
	/***
	 * 
	 * @user Marc
	 * @createtime 2015年1月22日 下午5:42:33
	 * @param id
	 * @return 根据栏目查询ID
	 */
	public List<Record> findByCategory(Object id){

		List<Record> list = super.cache(TableList._Article, "cid@@@"+id);
		if(list == null ){
			super.findByColumns(TableList._Article,new Object[]{"cid"},new Object[]{id});
			super.cache(TableList._Article, "cid@@@"+id,list);
		}
		return list ; 
	}
	
	/**
	 * 根据栏目ID获取指定数量的文章
	 * @user Marc
	 * @createtime 2015年1月25日 上午12:12:27
	 * @param id
	 * @param num
	 * @return 
	 */
	public List<Record> findByCategory(Object id, Object num) {
		Page<Record> page = findByCategory(1, Integer.parseInt(num.toString()), null, "order by releasetime desc" , " where cid = ?", new Object[]{id});
		return page.getList(); 
	}
	
	/***
	 * 比对文章，若文章无，则添加
	 * **这种方式资源消耗过大了呢。
	 * @user Marc
	 * @createtime 2015年1月27日 下午7:20:37
	 * @param listArticle
	 */
	public void comparisonArticle(List<Record> newList) {
		List<Record> oldlist = super.find(TableList._Article);
		for (int i = 0; i < newList.size(); i++) {
			Record newCord = newList.get(i);
			for (int j = 0; j < oldlist.size(); j++) {
				Record oldCord = oldlist.get(j);
				if(newCord.get("zhihuid") == oldCord.getLong("zhihuid")){
					break ; 
				}
				if(j+1 == oldlist.size()){
					addArticle(newCord);
				}
			}
		}
	}
	
	/**
	 * 添加一篇文章
	 * @user Marc
	 * @createtime 2015年1月27日 下午7:41:41
	 * @param newCord
	 */
	private void addArticle(Record newCord) {
		Db.save(getFullTable(TableList._Article), newCord);
	}

	/**
	 * 
	 * @user Marc
	 * @createtime 2015年1月22日 下午5:52:54
	 * @param pageNumber  页码
	 * @param pageSize 页量
	 * @param select 查询字段
	 * @param order 排序方式
	 * @param where 条件
	 * @param paras 参数
	 * @return
	 */
	public Page<Record> findByCategory(int pageNumber, int pageSize, String select, String order,String where, Object[] paras)	{
		String key = "pageNumber@@@"+pageNumber+"pageSize@@@"+pageSize+"select@@@"+select+"table@@@"+TableList._Article+"order@@@"+"where@@@"+where;
		if(paras!=null && paras.length!=0){
			key+="@@@"+paras.length;
			for (int i = 0; i < paras.length; i++) {
				key+="@@@"+paras[i];
			}
		}
		Page<Record> page = super.cache(TableList._Article, key);
		if(page == null ){
			String sqlExceptSelect = buildSqlExceptSelect(TableList._Article, order, where);
			page = super.paginate(pageNumber, pageSize, select, sqlExceptSelect, paras);
			super.cache(TableList._Article, key,page);
		}
		return page ; 
	}

	/***
	 * 获取最新文章
	 * @user Marc
	 * @createtime 2015年1月24日 下午11:09:25
	 * @param num 文章数量，默认为1
	 * @return
	 */
	public List<Record> getNewestArticle(int num) {
		num = num==0?1:num;
		Page<Record> page = findByCategory(1, num, null, "order by releasetime desc ", null, new Object[]{});
		return page.getList();
	}

	


	
}
